فارسی

قدرت داده‌های سری زمانی را با توابع پنجره‌ای آزاد کنید. این راهنما مفاهیم اساسی، مثال‌های عملی و تکنیک‌های پیشرفته تحلیل داده را پوشش می‌دهد.

تحلیل سری‌های زمانی: تسلط بر توابع پنجره‌ای برای کسب بینش از داده‌ها

داده‌های سری زمانی، که با ماهیت متوالی و وابسته به زمان خود مشخص می‌شوند، در تمام صنایع فراگیر هستند. از ردیابی قیمت سهام و نظارت بر ترافیک وب‌سایت گرفته تا تحلیل داده‌های حسگرها و پیش‌بینی روندهای فروش، توانایی استخراج بینش‌های معنادار از داده‌های سری زمانی برای تصمیم‌گیری آگاهانه حیاتی است. توابع پنجره‌ای (Window functions) مجموعه‌ای از ابزارهای قدرتمند و انعطاف‌پذیر را برای انجام محاسبات روی مجموعه‌ای از ردیف‌ها که با ردیف فعلی در یک جدول یا دیتافریم مرتبط هستند، فراهم می‌کنند و آن‌ها را برای تحلیل سری‌های زمانی ضروری می‌سازند.

درک داده‌های سری زمانی

داده‌های سری زمانی دنباله‌ای از نقاط داده هستند که به ترتیب زمانی فهرست شده‌اند. این نقاط داده می‌توانند معیارهای مختلفی را نشان دهند، مانند:

تحلیل داده‌های سری زمانی شامل شناسایی الگوها، روندها و فصلی بودن است که می‌توان از آن‌ها برای پیش‌بینی مقادیر آینده، تشخیص ناهنجاری‌ها و بهینه‌سازی فرآیندهای کسب‌وکار استفاده کرد.

مقدمه‌ای بر توابع پنجره‌ای

توابع پنجره‌ای، که به عنوان توابع تجمعی پنجره‌ای یا توابع تحلیلی نیز شناخته می‌شوند، به شما امکان می‌دهند محاسبات را بر روی مجموعه‌ای از ردیف‌های مرتبط با ردیف فعلی انجام دهید، بدون اینکه ردیف‌ها را مانند توابع تجمعی سنتی (مانند SUM، AVG، COUNT) در یک مجموعه نتیجه واحد گروه‌بندی کنید. این قابلیت به ویژه برای تحلیل سری‌های زمانی مفید است، جایی که اغلب نیاز به محاسبه میانگین‌های متحرک، جمع‌های تجمعی و سایر معیارهای مبتنی بر زمان دارید.

یک تابع پنجره‌ای معمولاً از اجزای زیر تشکیل شده است:

  1. تابع: محاسباتی که باید انجام شود (مانند AVG، SUM، RANK، LAG).
  2. عبارت OVER: پنجره ردیف‌هایی را که برای محاسبه استفاده می‌شود، تعریف می‌کند.
  3. عبارت PARTITION BY (اختیاری): داده‌ها را به پارتیشن‌ها تقسیم می‌کند و تابع پنجره‌ای به طور مستقل برای هر پارتیشن اعمال می‌شود.
  4. عبارت ORDER BY (اختیاری): ترتیب ردیف‌ها را در هر پارتیشن مشخص می‌کند.
  5. عبارت ROWS/RANGE (اختیاری): قاب پنجره را تعریف می‌کند که مجموعه ردیف‌های نسبت به ردیف فعلی است که برای محاسبه استفاده می‌شود.

مفاهیم و سینتکس کلیدی

۱. عبارت ()OVER

عبارت ()OVER قلب یک تابع پنجره‌ای است. این عبارت پنجره ردیف‌هایی را که تابع بر روی آن‌ها عمل خواهد کرد، تعریف می‌کند. یک عبارت ساده ()OVER بدون آرگومان، کل مجموعه نتیجه را به عنوان پنجره در نظر می‌گیرد. برای مثال:

مثال SQL:

SELECT
  date,
  sales,
  AVG(sales) OVER()
FROM
  sales_data;

این کوئری میانگین فروش را برای تمام تاریخ‌ها در جدول sales_data محاسبه می‌کند.

۲. PARTITION BY

عبارت PARTITION BY داده‌ها را به پارتیشن‌ها تقسیم می‌کند و تابع پنجره‌ای به طور جداگانه برای هر پارتیشن اعمال می‌شود. این زمانی مفید است که بخواهید معیارها را برای گروه‌های مختلف در داده‌های خود محاسبه کنید.

مثال SQL:

SELECT
  date,
  product_id,
  sales,
  AVG(sales) OVER (PARTITION BY product_id)
FROM
  sales_data;

این کوئری میانگین فروش را برای هر محصول به طور جداگانه محاسبه می‌کند.

۳. ORDER BY

عبارت ORDER BY ترتیب ردیف‌ها را در هر پارتیشن مشخص می‌کند. این برای محاسبه مجموع‌های جاری، میانگین‌های متحرک و سایر معیارهای مبتنی بر زمان ضروری است.

مثال SQL:

SELECT
  date,
  sales,
  SUM(sales) OVER (ORDER BY date)
FROM
  sales_data;

این کوئری جمع تجمعی فروش را در طول زمان محاسبه می‌کند.

۴. ROWS/RANGE

عبارات ROWS و RANGE قاب پنجره را تعریف می‌کنند که مجموعه ردیف‌های نسبت به ردیف فعلی است که برای محاسبه استفاده می‌شود. عبارت ROWS قاب پنجره را بر اساس شماره ردیف فیزیکی مشخص می‌کند، در حالی که عبارت RANGE قاب پنجره را بر اساس مقادیر ستون ORDER BY مشخص می‌کند.

مثال ROWS:

SELECT
  date,
  sales,
  AVG(sales) OVER (ORDER BY date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW)
FROM
  sales_data;

این کوئری میانگین متحرک فروش را در طول ۳ روز گذشته (شامل روز فعلی) محاسبه می‌کند.

مثال RANGE:

SELECT
  date,
  sales,
  AVG(sales) OVER (ORDER BY date RANGE BETWEEN INTERVAL '2' DAY PRECEDING AND CURRENT ROW)
FROM
  sales_data;

این کوئری میانگین متحرک فروش را در طول ۲ روز گذشته (شامل روز فعلی) محاسبه می‌کند. توجه داشته باشید که `RANGE` به ستونی مرتب‌شده از نوع داده عددی یا تاریخ/زمان نیاز دارد.

توابع پنجره‌ای رایج برای تحلیل سری‌های زمانی

۱. میانگین غلتان/متحرک

میانگین غلتان، که به عنوان میانگین متحرک نیز شناخته می‌شود، یک تکنیک پرکاربرد برای هموار کردن نوسانات کوتاه‌مدت در داده‌های سری زمانی و برجسته کردن روندهای بلندمدت است. این میانگین با محاسبه میانگین مقادیر در یک پنجره زمانی مشخص محاسبه می‌شود.

مثال SQL:

SELECT
  date,
  sales,
  AVG(sales) OVER (ORDER BY date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS moving_average_7_days
FROM
  sales_data;

این کوئری میانگین متحرک ۷ روزه فروش را محاسبه می‌کند.

مثال پایتون (با استفاده از Pandas):

import pandas as pd

# با فرض اینکه یک دیتافریم Pandas به نام 'sales_df' با ستون‌های 'date' و 'sales' دارید

sales_df['moving_average_7_days'] = sales_df['sales'].rolling(window=7).mean()

مثال کاربرد جهانی: یک خرده‌فروش چندملیتی می‌تواند از میانگین متحرک ۳۰ روزه برای هموار کردن نوسانات فروش روزانه و شناسایی روندهای فروش زیربنایی در مناطق مختلف استفاده کند.

۲. جمع تجمعی

جمع تجمعی، که به عنوان مجموع جاری نیز شناخته می‌شود، مجموع مقادیر را تا ردیف فعلی محاسبه می‌کند. این برای ردیابی کل مقدار انباشته شده در طول زمان مفید است.

مثال SQL:

SELECT
  date,
  sales,
  SUM(sales) OVER (ORDER BY date) AS cumulative_sales
FROM
  sales_data;

این کوئری جمع تجمعی فروش را در طول زمان محاسبه می‌کند.

مثال پایتون (با استفاده از Pandas):

import pandas as pd

# با فرض اینکه یک دیتافریم Pandas به نام 'sales_df' با ستون‌های 'date' و 'sales' دارید

sales_df['cumulative_sales'] = sales_df['sales'].cumsum()

مثال کاربرد جهانی: یک شرکت تجارت الکترونیک بین‌المللی می‌تواند از فروش تجمعی برای ردیابی کل درآمد حاصل از عرضه یک محصول جدید در بازارهای مختلف استفاده کند.

۳. Lead و Lag

توابع LEAD و LAG به شما امکان می‌دهند به ترتیب به داده‌های ردیف‌های بعدی یا قبلی دسترسی داشته باشید. این توابع برای محاسبه تغییرات دوره‌ای، شناسایی روندها و مقایسه مقادیر در دوره‌های زمانی مختلف مفید هستند.

مثال SQL:

SELECT
  date,
  sales,
  LAG(sales, 1, 0) OVER (ORDER BY date) AS previous_day_sales,
  sales - LAG(sales, 1, 0) OVER (ORDER BY date) AS sales_difference
FROM
  sales_data;

این کوئری تفاوت فروش را نسبت به روز قبل محاسبه می‌کند. تابع `LAG(sales, 1, 0)` مقدار فروش را از ردیف قبلی (با آفست ۱) بازیابی می‌کند و اگر ردیف قبلی وجود نداشته باشد (مثلاً ردیف اول)، مقدار پیش‌فرض ۰ را برمی‌گرداند.

مثال پایتون (با استفاده از Pandas):

import pandas as pd

# با فرض اینکه یک دیتافریم Pandas به نام 'sales_df' با ستون‌های 'date' و 'sales' دارید

sales_df['previous_day_sales'] = sales_df['sales'].shift(1)
sales_df['sales_difference'] = sales_df['sales'] - sales_df['previous_day_sales'].fillna(0)

مثال کاربرد جهانی: یک شرکت هواپیمایی جهانی می‌تواند از توابع lead و lag برای مقایسه فروش بلیط برای یک مسیر یکسان در هفته‌های مختلف و شناسایی نوسانات احتمالی تقاضا استفاده کند.

۴. Rank و Dense Rank

توابع RANK() و DENSE_RANK() بر اساس ترتیب مشخص شده، به هر ردیف در یک پارتیشن یک رتبه اختصاص می‌دهند. RANK() رتبه‌ها را با فاصله اختصاص می‌دهد (مثلاً ۱، ۲، ۲، ۴)، در حالی که DENSE_RANK() رتبه‌ها را بدون فاصله اختصاص می‌دهد (مثلاً ۱، ۲، ۲، ۳).

مثال SQL:

SELECT
  date,
  sales,
  RANK() OVER (ORDER BY sales DESC) AS sales_rank,
  DENSE_RANK() OVER (ORDER BY sales DESC) AS sales_dense_rank
FROM
  sales_data;

این کوئری مقادیر فروش را به ترتیب نزولی رتبه‌بندی می‌کند.

مثال کاربرد جهانی: یک بازار آنلاین جهانی می‌تواند از توابع رتبه‌بندی برای شناسایی محصولات پرفروش در هر کشور یا منطقه استفاده کند.

تکنیک‌ها و کاربردهای پیشرفته

۱. ترکیب توابع پنجره‌ای

توابع پنجره‌ای می‌توانند برای انجام محاسبات پیچیده‌تر با هم ترکیب شوند. به عنوان مثال، می‌توانید میانگین متحرک جمع تجمعی را محاسبه کنید.

مثال SQL:

SELECT
  date,
  sales,
  AVG(cumulative_sales) OVER (ORDER BY date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS moving_average_cumulative_sales
FROM
  (
    SELECT
      date,
      sales,
      SUM(sales) OVER (ORDER BY date) AS cumulative_sales
    FROM
      sales_data
  ) AS subquery;

۲. استفاده از توابع پنجره‌ای با تجميع شرطی

شما می‌توانید از توابع پنجره‌ای در ترکیب با تجميع شرطی (مثلاً با استفاده از عبارات CASE) برای انجام محاسبات بر اساس شرایط خاص استفاده کنید.

مثال SQL:

SELECT
  date,
  sales,
  AVG(CASE WHEN sales > 100 THEN sales ELSE NULL END) OVER (ORDER BY date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS moving_average_high_sales
FROM
  sales_data;

این کوئری میانگین متحرک فروش را فقط برای روزهایی محاسبه می‌کند که فروش بیشتر از ۱۰۰ باشد.

۳. تجزیه سری‌های زمانی

توابع پنجره‌ای می‌توانند برای تجزیه یک سری زمانی به اجزای روند، فصلی و باقیمانده آن استفاده شوند. این شامل محاسبه میانگین‌های متحرک برای تخمین روند، شناسایی الگوهای فصلی و سپس کم کردن اجزای روند و فصلی برای به دست آوردن باقیمانده‌ها است.

۴. تشخیص ناهنجاری

توابع پنجره‌ای می‌توانند برای تشخیص ناهنجاری‌ها در داده‌های سری زمانی با محاسبه میانگین‌های متحرک و انحرافات معیار استفاده شوند. نقاط داده‌ای که خارج از یک محدوده مشخص قرار می‌گیرند (مثلاً +/- ۳ انحراف معیار از میانگین متحرک) می‌توانند به عنوان ناهنجاری علامت‌گذاری شوند.

مثال‌های عملی در صنایع مختلف

۱. مالی

۲. خرده‌فروشی

۳. تولید

۴. مراقبت‌های بهداشتی

انتخاب ابزار مناسب

توابع پنجره‌ای در ابزارهای پردازش داده و زبان‌های برنامه‌نویسی مختلفی موجود هستند، از جمله:

انتخاب ابزار به نیازهای خاص و تخصص فنی شما بستگی دارد. SQL برای داده‌های ذخیره شده در پایگاه‌های داده رابطه‌ای مناسب است، در حالی که پایتون و اسپارک برای پردازش مجموعه داده‌های بزرگ و انجام تحلیل‌های پیچیده انعطاف‌پذیرتر هستند.

بهترین شیوه‌ها

نتیجه‌گیری

توابع پنجره‌ای ابزاری قدرتمند برای تحلیل سری‌های زمانی هستند که به شما امکان می‌دهند میانگین‌های متحرک، جمع‌های تجمعی، مقادیر lead/lag و سایر معیارهای مبتنی بر زمان را محاسبه کنید. با تسلط بر توابع پنجره‌ای، می‌توانید بینش‌های ارزشمندی از داده‌های سری زمانی خود استخراج کرده و تصمیمات آگاهانه‌تری بگیرید. چه در حال تحلیل داده‌های مالی، داده‌های فروش، داده‌های حسگر یا داده‌های ترافیک وب باشید، توابع پنجره‌ای می‌توانند به شما در شناسایی الگوها، روندها و ناهنجاری‌هایی کمک کنند که تشخیص آن‌ها با استفاده از تکنیک‌های تجمعی سنتی دشوار است. با درک مفاهیم کلیدی و سینتکس توابع پنجره‌ای و پیروی از بهترین شیوه‌ها، می‌توانید به طور مؤثر از آنها برای حل طیف گسترده‌ای از مشکلات دنیای واقعی در صنایع مختلف استفاده کنید.